package cn.wmw.demo;

import cn.wmw.domain.User;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;


public class StreamDemo {

    /**
     * 利用Stream流动态创建list并添加元素
     * @param users
     * @return
     */
    public static List<User> creatList(User... users){
        List<User> usersList = Stream.of(users).collect(Collectors.toList());
        return usersList;
    }

    /**
     * 获取list中对象某一属性，并生成新的list。此处以获取User对象的name为例
     * @param userList
     * @return
     */
    public static List<String> collectName(List<User> userList){
        List<String> nameList = userList.stream().map(User::getName).collect(Collectors.toList());
        return nameList;
    }

    /**
     * 利用stream的filter方法，过滤掉我们不需要的数据，此处以过滤User对象中name为空的例子
     * @param userList
     * @return
     */
    public static List<User> filterNull(List<User> userList){
        List<User> filterList = userList.stream().filter(user -> user.getName()!=null).collect(Collectors.toList());
        return filterList;
    }

    /**
     * 利用Collectors.groupingBy，根据我们所需要的某些属性，将list中的对象进行分组，放入新的list中。
     * 此处以根据User对象的sex字段进行分组。
     * @param userList
     * @return
     */
    public static Map<String,List<User>> groupBySex(List<User> userList){
        Map<String, List<User>> sexMap = userList.stream().collect(Collectors.groupingBy(User::getSex, Collectors.toList()));
        return sexMap;
    }

    /**
     * 利用stream流求和，返回对象中某一属性的总和
     * 数据类型只能为：int, double, long
     * @param userList
     * @return
     */
    public static Double sumHeight(List<User> userList){
        Double heightSum = userList.stream().mapToDouble(User::getHeight).sum();
        return heightSum;

    }

    public static void main(String[] args) {
        User user1 = new User("test1",21,"man",1.78);
        User user2 = new User("test2",18,"woman",1.68);
        User user3 = new User("test3",35,"man",1.83);

        // 快速创建list
        List<User> usersList = creatList(user1, user2, user3);
        usersList.stream().forEach(System.out::println);
        // 获取某个字段
        List<String> strings = collectName(usersList);
        strings.stream().forEach(System.out::println);
        // 过滤条件
        List<User> users = filterNull(usersList);
        users.stream().forEach(System.out::println);
        // 分组收集
        Map<String, List<User>> stringListMap = groupBySex(usersList);
        System.err.println(stringListMap);
        // 计算某个字段之和
        Double aDouble = sumHeight(usersList);
        System.err.println(aDouble);
    }

}
